package model

import (
	"html/template"
	"time"
)

// Category 分类
type Category struct {
	ID         string    `json:"id" bson:"_id,omitempty"`                          //ID
	Name       string    `json:"name" bson:"name"`                                 //分类名称
	Seq        int       `json:"seq" bson:"seq"`                                   // 排序号
	Icon       string    `json:"icon" bson:"icon"`                                 // 图标
	CreateTime time.Time `json:"createTime,omitempty" bson:"createTime,omitempty"` //创建时间

	RenderedIcon template.HTML `json:"-" bson:"-"` // 渲染后的html内容
}

const CategoryCollectionName = "category" // 集合名常量

// ArticleDir 文件夹 方便管理文章
type ArticleDir struct {
	ID         int64     `json:"id" bson:"_id,omitempty"`                          // ID
	Name       string    `json:"name" bson:"name"`                                 // 目录名称
	UserId     string    `json:"userId" bson:"userId"`                             // 用户ID (关联user.username)
	Seq        int       `json:"seq" bson:"seq"`                                   // 排序号
	CreateTime time.Time `json:"createTime,omitempty" bson:"createTime,omitempty"` // 创建时间
	ArticleIds []string  `json:"articleIds" bson:"articleIds,omitempty"`           // 文章ID列表
}

const ArticleDirCollectionName = "article_dir" // 集合名常量

// Article 文章，文章发布之后<==>Blog
// 发布之后的文章==博客Blog，未发布的文章==草稿Draft
type Article struct {
	ID           string     `json:"id,omitempty" bson:"_id,omitempty"`                  //ID（必须）
	Title        string     `json:"title" bson:"title"`                                 //文章标题（必须）
	AuthorId     string     `json:"authorId" bson:"authorId"`                           //作者ID (关联user.username)（必须）
	AuthorName   string     `json:"authorName" bson:"authorName"`                       //作者昵称（必须）
	AuthorAvatar string     `json:"authorAvatar" bson:"authorAvatar"`                   //作者头像（必须）
	CategoryId   string     `json:"categoryId" bson:"categoryId"`                       //文章分类ID（必须）
	CategoryName string     `json:"categoryName" bson:"categoryName"`                   //文章分类名称（必须）
	Content      string     `json:"content" bson:"content"`                             //文章内容（必须）
	ShowText     string     `json:"showText" bson:"showText"`                           //文章简短内容（必须）
	Photo        string     `json:"photo" bson:"photo"`                                 //文章封面图片
	PublishTime  *time.Time `json:"publishTime,omitempty" bson:"publishTime,omitempty"` //公开发布时间
	Status       int        `json:"status" bson:"status"`                               //文章状态：
	DirId        int64      `json:"dirId" bson:"dirId"`                                 //文章目录ID
	SectionId    string     `json:"sectionId" bson:"sectionId"`                         //文章的专栏ID
	SectionName  string     `json:"sectionName" bson:"sectionName"`                     //文章的专栏名称
	Tags         []string   `json:"tags,omitempty" bson:"tags,omitempty"`               //文章标签
	CreateTime   time.Time  `json:"createTime,omitempty" bson:"createTime,omitempty"`   //文章创建时间
	UpdateTime   time.Time  `json:"updateTime,omitempty" bson:"updateTime,omitempty"`   //文章更新时间
	BlogStats    *BlogStats `json:"blogStats,omitempty" bson:"-"`

	RenderedContent  template.HTML `json:"-" bson:"-"` // 渲染后的html内容
	RenderedShowText template.HTML `json:"-" bson:"-"` // 渲染后的简短内容
	RenderedTitle    template.HTML `json:"-" bson:"-"` // 渲染后的标题
}

const ArticleCollectionName = "article" // 集合名常量

// BlogStats 文章资源属性 stats
type BlogStats struct {
	ID            string `json:"id" bson:"_id,omitempty"`            // 文章ID (主键)
	ClickCount    int    `json:"clickCount" bson:"clickCount"`       // 文章阅读数
	CommentCount  int    `json:"commentCount" bson:"commentCount"`   // 文章评论数
	LikeCount     int    `json:"likeCount" bson:"likeCount"`         // 文章点赞数
	FavoriteCount int    `json:"favoriteCount" bson:"favoriteCount"` // 文章收藏数
}

const BlogStatsCollectionName = "blog_stats" // 集合名常量

// Section 文章专栏
type Section struct {
	ID          string `json:"id" bson:"_id,omitempty"`        // ID
	Name        string `json:"name" bson:"name"`               // 专栏名称
	Description string `json:"description" bson:"description"` // 专栏描述
	Photo       string `json:"photo" bson:"photo"`             //专栏封面图片
	UserId      string `json:"userId" bson:"userId"`           // 用户ID (关联user.username)

	CreateTime time.Time `json:"createTime,omitempty" bson:"createTime,omitempty"` // 创建时间

	BlogCount int `json:"blogCount" bson:"-"` //专栏下的文章
}

const SectionCollectionName = "section" // 集合名常量

// Comment 文章评论实体
type Comment struct {
	ID          string    `json:"id" bson:"_id,omitempty"`                          // ID (主键)
	BlogId      string    `json:"blogId" bson:"blogId,omitempty"`                   // 文章ID，此评论属于哪个文章
	Content     string    `json:"content" bson:"content,omitempty"`                 // 内容
	RootId      string    `json:"rootId" bson:"rootId,omitempty"`                   // 评论的根评论ID（针对子级评论）
	ReplyId     string    `json:"replyId" bson:"replyId"`                           // 评论回复的是哪个评论ID（针对子级评论）
	ReplyToUser string    `json:"replyToUser" bson:"replyToUser"`                   // 评论回复的用户昵称（针对子级评论，ReplyToUser和replyId是同一个评论的）
	LikeCount   int       `json:"likeCount" bson:"likeCount"`                       // 点赞数量
	UserId      string    `json:"userId" bson:"userId"`                             // 用户ID (关联user.username)
	Nickname    string    `json:"nickname" bson:"nickname"`                         // 用户昵称
	AvatarUrl   string    `json:"avatarUrl" bson:"avatarUrl"`                       // 用户头像
	Status      int       `json:"status" bson:"status"`                             // 评论状态 0-待审核 1-正常状态 2-被隐藏状态（比如多人举报）
	CreateTime  time.Time `json:"createTime,omitempty" bson:"createTime,omitempty"` // 创建时间

	// 子级评论（只有一级评论才有子评论），不持久化
	ChildComments []*Comment `json:"childComments,omitempty" bson:"-"` // 子级评论
	ReplyComment  *Comment   `json:"replyComment,omitempty" bson:"-"`  //关联回复的评论

}

const CommentCollectionName = "comment" // 集合名常量

// CollectRelation 用户的一些操作关联实体：比如评论、点赞、收藏等
type CollectRelation struct {
	ID          int64  `json:"id,omitempty" bson:"_id,omitempty"`                 // ID (主键)
	UserId      string `json:"userId,omitempty" bson:"userId,required"`           // 用户ID
	TargetId    string `json:"targetId,omitempty" bson:"targetId,required"`       // 目标ID
	SubTargetId string `json:"subTargetId,omitempty" bson:"subTargetId"`          // 二级目标ID
	CollectType string `json:"collectType,omitempty" bson:"collectType,required"` // 类型（like、favorite）
}

const CollectRelationCollectionName = "collect_relation" // 集合名常量

type CollectQuery struct {
	UserId       string
	TargetId     string
	SubTargetId  string
	CollectTypes []string
}

// BlogDoc 搜索文档-文章实体（Manticore Search 索引文档）
// 作用：用于存储文章的搜索索引数据，优化全文检索性能，支持标题、内容等字段的快速查询
// 设计特点：
//  1. 扁平化结构：将 BlogStats 中的统计字段（阅读数、评论数等）直接嵌入，避免嵌套查询
//  2. 搜索优化：包含标题（Title）、简短内容（ShowText）等核心检索字段，适配 Manticore 全文索引
//
// 注意：字段名通过 db 标签与 Manticore 索引表字段映射，需与索引表结构保持一致
type BlogDoc struct {
	ID           int64  `json:"_id,omitempty" db:"id,omitempty"` //内部ID（主键）
	BlogId       string `json:"blogId,omitempty" db:"blog_id"`   //ID（必须）
	Title        string `json:"title" db:"title"`                //文章标题（必须）
	CategoryId   string `json:"categoryId" db:"category_id"`     //文章分类ID（必须）
	CategoryName string `json:"categoryName" db:"category_name"` //文章分类名称（必须）
	ShowText     string `json:"showText" db:"show_text"`         //文章简短内容（必须）
	Photo        string `json:"photo" db:"photo"`                //文章封面图片

	AuthorId     string `json:"authorId" db:"author_id"`         //作者ID (关联user.username)（必须）
	AuthorName   string `json:"authorName" db:"author_name"`     //作者昵称（必须）
	AuthorAvatar string `json:"authorAvatar" db:"author_avatar"` //作者头像（必须）

	Hidden      int   `json:"hidden" db:"hidden"`                      //文章是否被隐藏 0-正常 1-被隐藏
	PublishTime int64 `json:"publishTime,omitempty" db:"publish_time"` //公开发布时间

	/*BlogStats属性平放*/
	ClickCount    int `json:"clickCount" db:"click_count"`       // 文章阅读数
	CommentCount  int `json:"commentCount" db:"comment_count"`   // 文章评论数
	LikeCount     int `json:"likeCount" db:"like_count"`         // 文章点赞数
	FavoriteCount int `json:"favoriteCount" db:"favorite_count"` // 文章收藏数

	LightTitle string `json:"lightTitle" db:"light_title"` // 文章高亮文本（不存储，只用于展示）
	LightText  string `json:"lightText" db:"light_text"`   // 文章高亮文本（不存储，只用于展示）
}
